const vscode = require("vscode");
const fs = require("fs");
const path = require("path");
const { fetchFileContent, putFileContent } = require("../../utils/gitee.js");
const { refreshCodeSnippetsTip } = require("./codeCompletion.js");

async function getGiteeConfig(context) {
  const gitConfigFilePath = path.join(context.extensionPath, "config/gitConfig.json");
  let gitConfigData = {};
  if (fs.existsSync(gitConfigFilePath)) {
    gitConfigData = JSON.parse(fs.readFileSync(gitConfigFilePath, "utf8") || "{}");
  }
  return gitConfigData;
}

function getGiteeRepositorySnippetsUrl({ owner, repo } = {}) {
  return `https://gitee.com/api/v5/repos/${owner}/${repo}/contents/codeSnippets/snippets.json`;
}
// 注册保存代码片段的命令
function saveSnippet(context) {
  const saveSnippetDisposable = vscode.commands.registerCommand("BobCodeSnippers.saveSnippet", async () => {
    // 当前打开获取焦点的文件
    const editor = vscode.window.activeTextEditor;
    if (editor) {
      // 编辑器上选择的代码文本
      const text = editor.document.getText(editor.selection);

      // 提示用户输入自定义名称
      const snippetName = await vscode.window.showInputBox({
        placeHolder: "请输入代码片段的自定义名称",
      });

      if (snippetName) {
        let snippetsData = {};
        // 读取已有路径羡慕的的代码片段数据
        const snippetsFilePath = path.join(context.extensionPath, "config/snippets.json");
        if (fs.existsSync(snippetsFilePath)) {
          // 读取之前收藏的代码
          snippetsData = JSON.parse(fs.readFileSync(snippetsFilePath, "utf8"));
        }
        // 将新的代码片段添加到数据中
        snippetsData[snippetName] = text;
        const modifiedContent = JSON.stringify(snippetsData, null, 2);
        // 同步更新代码等待保存完成之后更新后的代码片段数据
        fs.writeFileSync(snippetsFilePath, JSON.stringify(snippetsData, null, 2), "utf8");
        vscode.window.showInformationMessage(`代码片段已保存到插件，稍后会自动同步到您的gitee项目！`);

        /**
         * 同步到用户自己的gitee仓库
         */
        const giteeConfig = await getGiteeConfig(context);
        // 安装插件之后，配置的token 用户，项目 三个参数
        const { token, owner, repo } = giteeConfig;
        // 读取用户配置的自己gitee仓库 codeSnippets文件夹下的 snippets.json文件
        const url = getGiteeRepositorySnippetsUrl(giteeConfig);
        const file = await fetchFileContent(url, token);

        /**
         * TextEncoder 是一个内置的 JavaScript 对象，用于将字符串编码为 UTF-8 格式的 Uint8Array。它通常用于需要将文本数据转换为二进制格式的场景，例如在网络传输或文件存储中。
         * btoa 方法用于将一个字符串编码为 Base64 格式的字符串。
         * Base64 编码是一种常见的编码方式，用于在文本协议中传输二进制数据。
         */
        const encoder = new TextEncoder();
        const data = encoder.encode(modifiedContent);
        const encodedContent = btoa(String.fromCharCode.apply(null, new Uint8Array(data)));

        /** 新的内容加入到文件.json文件中 */
        const res = await putFileContent(url, token, encodedContent, file.sha, "更新代码片段");
        vscode.window.showInformationMessage(`代码片段 "${snippetName}" 同步到gitee仓库 ${res ? "成功" : "失败"}！`);
        refreshCodeSnippetsTip(context);
      }
    }
  });
  context.subscriptions.push(saveSnippetDisposable);
  return saveSnippetDisposable;
}

module.exports = {
  saveSnippet,
};
